#include "sock.hpp"
int main()
{
  // 测试版
  // Udp_myshell s;
  // int sock = s.Create();
  // s.Bind();
  // char buffer[1024];
  // sockaddr_in client;
  // socklen_t len = sizeof(client);
  // while(true)
  // {
  //   ssize_t s = recvfrom(sock, buffer, 1023, 0, (sockaddr*)(&client), &len);
  //   buffer[s] = '\0';
  //   cout<<buffer<<endl;
  // }
  // myshell版
  // 服务器初始化
  Udp_myshell serve;
  int sock = serve.Create();
  serve.Bind();
  // 接收缓冲区
  char buffer[BUFFER_NUM];
  // 客户端信息
  sockaddr_in client;
  socklen_t len = sizeof(client);
  while (true)
  {
    ssize_t s = recvfrom(sock, buffer, sizeof(buffer), 0, (sockaddr *)(&client), &len);
    // 创建子进程并且读取数据到管道中
    FILE *fp = popen(buffer, "r");
    // 判断是否成功
    if(fp == nullptr)
      cout << strerror(errno) << endl;
    buffer[0] = '\0';
    // 避免前面已读的数据被覆盖,若是动态的命令例如top等，这里会有越界的错误
    while(fgets(buffer + strlen(buffer), 1024, fp));
    sendto(sock, buffer, strlen(buffer), 0, (sockaddr*)(&client), len);
    memset(buffer, 0, BUFFER_NUM);
    // 关闭
    pclose(fp);
  }

  return 0;
}
